/* 
 * File:   structures.h
 * Author: stoppy
 *
 * Created on 17 marzo 2009, 10.02
 */
#include <glib-2.0/glib.h>
#include <pthread.h>
#include <time.h>
#ifndef _STRUCTURES_H
#define	_STRUCTURES_H

#ifdef	__cplusplus
extern "C" {
#endif

    /*
     * Struttura di definizione del chunk
     * con i relativi dati.
     */
    struct chunk{
        
        char ID[33];

        char IDF[33];

        size_t size;
        
        char chk[10240];

    };

    /*
     * Struttura che conta i chunk presenti
     * la variabile increment puo' essere quindi
     * aumentata (+) o diminuita (-)
     */

    struct chunkIncrement{
        char ID[33];
        int increment; //puo' essere positivo o negativo
    };

    
    /*
     * Struttura chunk ridotta
     */
    
    struct chunkLight{
        char ID[33];
        char IDF[33];
    };

    struct chunkPoss{

        char ID[33];

        char IDF[33];

        pthread_mutex_t mutexChunkPoss;

        struct elemPoss * firstPoss;
        
    };

    struct elemPoss{

        struct peer * p;

        pthread_mutex_t mutexPoss1;

        struct elemPoss * next;

        struct elemPoss * prev;

    };

    /*
     *
     */

    struct peer{
        char addr[32];
        int port;
        int load;
        float ava;
        pthread_mutex_t mutexPeer;
        GList *poss;
    };

    /*
     *
     */

    struct peerLight{
        char addr[32];
        int port;
    };

    /*
     *
     */
    struct structListedPoss{
        char ID[32];
        int Nposs;
        struct peerLight* pll;
    };
    
    struct superPeer{
        char addr[32];
        int port;
        int load;
        double ava;
        char hash[33];
    };

    //utilizzata per effettuare il routing dal peer
    //è gestita da una GList
    struct elemRouting{

        struct peerLight *pl;

        float distance;

        int chunkPosseduti;

    };
    
    struct peerPossessorChunk{

        char ID[33];

        int nS;

        struct elemRouting * elr;
        
    };

    struct elemCache{

        struct peerLight * plc;

        float distance;

        time_t timeout;

    };
    

#ifdef	__cplusplus
}
#endif

#endif	/* _STRUCTURES_H */

